Skip to content

deps: update V8 to 14.9 - #64784

Open
targos wants to merge 34 commits into
nodejs:mainfrom
targos:v8-149
Open

deps: update V8 to 14.9#64784
targos wants to merge 34 commits into
nodejs:mainfrom
targos:v8-149

Conversation

@targos

@targos targos commented Jul 27, 2026

Copy link
Copy Markdown
Member

See #62572 for some context.

targos and others added 30 commits July 27, 2026 15:35
Major V8 updates are usually API/ABI incompatible with previous
versions. This commit adapts NODE_MODULE_VERSION for V8 14.9.

Refs: https://github.com/nodejs/CTC/blob/master/meetings/2016-09-28.md
PR-URL: nodejs#61898
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
It's causing linker errors with node.lib in node-gyp and potentially
breaks other 3rd party tools

Refs: nodejs#55784
PR-URL: nodejs#61898
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
GCC emits warnings because of the trailing backslashes.

PR-URL: nodejs#61898
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
illumos pointers are VA48, can allocate from the top of the 64-bit range
as well.

PR-URL: nodejs#61898
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
In illumos, madvise(3C) now takes `void *` for its first argument
post-illumos#14418, but uses `caddr_t` pre-illumos#14418. This fix will
detect if the illumos mman.h file in use is pre-or-post-illumos#14418 so
builds can work either way.

PR-URL: nodejs#61898
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Original commit message:

    GCC 15 removed avx10.2-512 target

    PiperOrigin-RevId: 823560321

Refs: google/highway@989a498
Fixes: nodejs#60566
PR-URL: nodejs#61898
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
PR-URL: nodejs#61898
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
aix: simplify OS::DecommitPages implementation

Replace complex mmap/munmap retry logic with mprotect + madvise
approach.

This fixes a race condition that was causing test failures in Node.js.
Node.js stress test was run with this fix and testing shows
0 failures out of 1000 runs of wpt/test-wasm-jsapi with this
patch compared to 224 failures without it.

Refs: nodejs#62647
Refs: https://chromium-review.googlesource.com/c/v8/v8/+/7780464
PR-URL: nodejs#61898
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Signed-Off-By: Michaël Zasso <targos@protonmail.com>
Original commit message:

    [fastapi] Store v8::CFunction pointer directly in FunctionTemplateInfo

    FunctionTemplateInfo objects store a list of C-function pointer and
    signature pairs used to generate fast API calls. Previously, a separate
    struct was allocated and wrapped in a Managed<> object to store these
    pairs.

    With this CL, the v8::CFunction object provided by the API is instead
    wrapped in a Foreign object and stored directly in the
    FunctionTemplateInfo. Replacing Managed<> objects with Foreign objects
    restores the ability to serialize FunctionTemplateInfo objects.

    This change relies on the assumption that the CFunction object passed to
    FunctionTemplate::New outlives the FunctionTemplate itself. In practice,
    all embedders—including Chrome—already ensure this by holding the
    CFunction object in a static variable. In Chrome, this is how it has
    always been done; see, for example:
    https://source.chromium.org/chromium/chromium/src/+/main:out/android-Debug/gen/third_party/blink/renderer/bindings/modules/v8/v8_webgl2_rendering_context.cc;l=19485;drc=398e74869153a12e825bc789c2134762cbe81c36

    Change-Id: Ib5eadb62b50edf7bd289a501f737750ed6e9e4fb
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7828135
    Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
    Reviewed-by: Arash Kazemi <arashk@chromium.org>
    Commit-Queue: Andreas Haas <ahaas@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#107265}

Refs: v8/v8@84f4af5
Original commit message:

    [wasm] Make LimitsByte::is_shared() work in GCC

    Importing a shared WebAssembly memory currently fails under gcc with

    LinkError: ...mismatch in shared state of memory, declared = 0,
    imported = 1

    Since SharedFlag is `enum class : bool`, due to
    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96496, gcc currently
    incorrectly truncates the integer instead of converting it into
    boolean, so 0x3 ends up being converted to SharedFlag::kNo.
    This patch works around it with an explicit conversion.

    Change-Id: I426e578513b721888076c64616d2486ccae9e12a
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7867245
    Reviewed-by: Manos Koukoutos <manoskouk@chromium.org>
    Commit-Queue: Joyee Cheung <joyee@igalia.com>
    Cr-Commit-Position: refs/heads/main@{#107524}

Refs: v8/v8@000de18
Original commit message:

    [api] Add explicit `inline` to definitions using V8_INLINE

    `__forceinline` is only a hint and does not enforce inline linkage.
    When `V8_INLINE` expands to just `__forceinline`, out-of-class
    definitions can still violate ODR. Add explicit `inline` so it holds
    across all toolchains.

    Refs: nodejs#62572
    Change-Id: I531f4a53e74dcaaf3b7b175cddc72e81ff6e5e4e
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7874797
    Reviewed-by: Leszek Swirski <leszeks@chromium.org>
    Commit-Queue: Joyee Cheung <joyee@igalia.com>
    Cr-Commit-Position: refs/heads/main@{#107600}

Refs: v8/v8@bfa86ad
Original commit message:

    [runtime] Fix non-conforming std::atomic_flag initialization

    std::atomic_flag has no constructor taking bool. Use ATOMIC_FLAG_INIT
    to ensure it works across different standard library implementations.

    Refs: nodejs#62572
    Change-Id: If5ff61339560aa0b9a2219aad9e5b6f2fd2b1155
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7874000
    Reviewed-by: Clemens Backes <clemensb@chromium.org>
    Commit-Queue: Joyee Cheung <joyee@igalia.com>
    Cr-Commit-Position: refs/heads/main@{#107728}

Refs: v8/v8@70924d7
Original commit message:

    [api] Add ArrayBuffer::CopyArrayBufferBytes

    Make the not uncommon case of copying bytes from one ArrayBuffer to
    another easier and less surprising, in particular when SharedArrayBuffer
    semantics are involved.

    Change-Id: I2a2bc5cba4e8c3b2d88cfcb2df0ef7e2021a8f6f
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7735151
    Auto-Submit: Ben Noordhuis <info@bnoordhuis.nl>
    Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
    Reviewed-by: Olivier Flückiger <olivf@chromium.org>
    Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#107890}

Refs: v8/v8@ba2b3f0
Original commit message:

    [api] Deprecate kPromiseRejectAfterResolved and kPromiseResolveAfterResolved

    These events will be removed soon.

    Bug: 42213031
    Change-Id: Ie70474ff33c40c7d9cb0c2d0fbe6b75da3c53a22
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7774767
    Commit-Queue: Kevin Gibbons <bakkot@gmail.com>
    Reviewed-by: Olivier Flückiger <olivf@chromium.org>
    Reviewed-by: Leszek Swirski <leszeks@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#107395}

Refs: v8/v8@1a391f9
Original commit message:

    [api] Remove PromiseResolveAfterResolved and PromiseRejectAfterResolved

    These were previously deprecated in https://crrev.com/c/7774767

    Bug: 42213031
    Change-Id: I07b802b743bf052611f30a61c1132231df22f0bd
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7897881
    Commit-Queue: Olivier Flückiger <olivf@chromium.org>
    Reviewed-by: Camillo Bruni <cbruni@chromium.org>
    Reviewed-by: Olivier Flückiger <olivf@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#108040}

Refs: v8/v8@0cc9eb2
Original commit message:

    [builtins] Make Promise resolvers not keep resolved Promises alive

    Currently a Promise's resolve/reject functions unconditionally hold the
    Promise, plus a separate bit to track whether the Promise has been
    resolved. Instead, hold a single field with Promise|Undefined.

    This allows GC'ing a resolved Promise even if its resolvers are still
    alive.

    R=olivf@chromium.org

    Fixed: 42213031
    Change-Id: Ice645dbabb79e63dfcac8ae843cad95439d7a1f1
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7646250
    Reviewed-by: Darius Mercadier <dmercadier@chromium.org>
    Commit-Queue: Kevin Gibbons <bakkot@gmail.com>
    Reviewed-by: Olivier Flückiger <olivf@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#108183}

Refs: v8/v8@da20a19
Original commit message:

    [execution] Lookup interceptor for RestrictedGlobalProperty

    When the script context looks up if a global property is
    restricted, it should also query the global interceptor.

    To avoid calling the interceptor for every declaration
    unconditionally, an interceptor has to be defined with
    `PropertyHandlerFlags::kHasDontDeleteProperty`
    to intercept restricted global property queries.

    Refs: nodejs#63715
    Refs: nodejs#52634

    Change-Id: I623ff285c4e8773d8ee7f681cbad68ba24bd3f40
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7898818
    Reviewed-by: Leszek Swirski <leszeks@chromium.org>
    Reviewed-by: Igor Sheludko <ishell@chromium.org>
    Commit-Queue: Igor Sheludko <ishell@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#108280}

Refs: v8/v8@a05321e
Signed-off-by: Chengzhong Wu <cwu631@bloomberg.net>
PR-URL: nodejs#64202
Fixes: nodejs#63715
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Original commit message:

    [wasm] Fix jump table slot overflow on x64 with CET enabled

    JumpTableAssembler::EmitJumpSlot for x64 was advancing the PC before
    checking if the target was reachable via a 32-bit displacement when CET
    was enabled. This caused a slot overflow when the far-jump fallback was
    triggered, as the second attempt to emit the slot would start at an
    incorrect offset.

    This CL ensures that the displacement check is performed before any
    instructions are emitted, making the function side-effect-free on
    failure. It also introduces kJumpTableSlotEntryMarkerSize to clarify
    the displacement calculation, following the pattern used on ARM64.

    Reported-by: Fabien Romano <fabienromano@gmail.com>

    TAG=agy
    R=jkummerow@chromium.org

    Fixed: 532112743
    Change-Id: Iaf6f15b51a66a45711e8556972ac0d353e6117c7
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8063803
    Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
    Commit-Queue: Clemens Backes <clemensb@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#108556}

Refs: v8/v8@1158ae7
Original commit message:

    [loong64][compiler] Extend Word64Select instruction functionality

    Change-Id: Iba762777642d2d2d3aa904f9afc1e9005139992e
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7801520
    Reviewed-by: Zhao Jiazhong <zhaojiazhong-hf@loongson.cn>
    Commit-Queue: Liu Yu <liuyu@loongson.cn>
    Reviewed-by: Darius Mercadier <dmercadier@chromium.org>
    Auto-Submit: Liu Yu <liuyu@loongson.cn>
    Cr-Commit-Position: refs/heads/main@{#107619}

Refs: v8/v8@c4d06ba
Co-authored-by: liujiahui <liujiahui@loongson.cn>
PR-URL: nodejs#63731
Fixes: nodejs#63721
Reviewed-By: René <contact.9a5d6388@renegade334.me.uk>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Co-Authored-By: Joyee Cheung <joyeec9h3@gmail.com>
Signed-Off-By: Michaël Zasso <targos@protonmail.com>
Signed-Off-By: Michaël Zasso <targos@protonmail.com>
Post-mortem libraries should use v8's debug_helper library instead.
- Set/GetPrototype
- Holder

Signed-Off-By: Michaël Zasso <targos@protonmail.com>
Signed-Off-By: Michaël Zasso <targos@protonmail.com>
Signed-Off-By: Michaël Zasso <targos@protonmail.com>
Signed-off-by: Joyee Cheung <joyeec9h3@gmail.com>
ICU_UTIL_DATA_SHARED had been removed since
https://crrev.com/c/1513615, but Node.js still defined
it and relied on the removed path on Windows, so the ICU
initialization in mksnapshot had been silently failing
since then. https://crrev.com/c/7679153 made the failure
visible so the build started breaking on Windows. Fix it
by always using ICU_UTIL_DATA_STATIC since we already compile
the ICU data statically in.

Signed-off-by: Joyee Cheung <joyeec9h3@gmail.com>
Signed-off-by: Joyee Cheung <joyeec9h3@gmail.com>
V8 bumped its wire-format version from 0x0f to 0x10. Update the
expected hex in test-v8-serdes, and derive the v8 header bytes
dynamically in test-runner-v8-deserializer so it tracks future
bumps automatically.

Signed-off-by: Joyee Cheung <joyeec9h3@gmail.com>
@targos targos added help wanted Issues that need assistance from volunteers or PRs that need help to proceed. semver-major PRs that contain breaking changes and should be released in the next major version. v8 engine Issues and PRs related to the V8 dependency. labels Jul 27, 2026
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/gyp
  • @nodejs/security-wg

@nodejs-github-bot nodejs-github-bot added build Issues and PRs related to build files or the CI. dependencies Pull requests that update a dependency file. needs-ci PRs that need a full CI run. labels Jul 27, 2026
@targos

targos commented Jul 27, 2026

Copy link
Copy Markdown
Member Author

make test on my Mac in Debug mode gives one error:

> out/Debug/node test/parallel/test-experimental-shared-value-conveyor.js
    at Object.<anonymous> (/Users/mzasso/git/nodejs/v8-next-update/test/parallel/test-experimental-shared-value-conveyor.js:34:10)
    at Module._compile (node:internal/modules/cjs/loader:1937:14)
    at Object..js (node:internal/modules/cjs/loader:2077:10)
    at Module.load (node:internal/modules/cjs/loader:1659:32)
    at Module._load (node:internal/modules/cjs/loader:1451:12)
    at wrapModuleLoad (node:internal/modules/cjs/loader:261:19)
    at Module.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:154:5)
    at node:internal/main/run_main_module:33:47 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: '#\n' +
    '# Fatal error\n' +
    '# Debug check failed: v8_flags.shared_string_table && !v8_flags.fuzzing implies isolate->is_shared_space_isolate().\n' +
    '#\n' +
    '#\n' +
    '#\n' +
    '#FailureMessage Object: 0x171e01158\n' +
    '----- Native stack trace -----\n' +
    '\n' +
    ' 1: 0x100d60bd0 node::DumpNativeBacktrace(__sFILE*) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    ' 2: 0x101013068 node::NodePlatform::GetStackTracePrinter()::$_0::operator()() const [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    ' 3: 0x101013024 node::NodePlatform::GetStackTracePrinter()::$_0::__invoke() [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    ' 4: 0x103efadf8 V8_Fatal(char const*, ...) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    ' 5: 0x103efa6bc v8::base::SetFatalFunction(void (*)(char const*, int, char const*)) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    ' 6: 0x101991ecc v8::internal::JsonParser<unsigned char>::JsonParser(v8::internal::Isolate*, v8::internal::Handle<v8::internal::String>, std::__1::optional<v8::internal::ScriptDetails>) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    ' 7: 0x101990600 v8::internal::JsonParser<unsigned char>::Parse(v8::internal::Isolate*, v8::internal::Handle<v8::internal::String>, v8::internal::Handle<v8::internal::Object>, std::__1::optional<v8::internal::ScriptDetails>) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    ' 8: 0x101466320 v8::internal::Builtin_JsonParse(int, unsigned long*, v8::internal::Isolate*) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    ' 9: 0x102e0162c Builtins_CEntry_Return1_ArgvOnStack_BuiltinExit [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '10: 0x102c9d0a4 Builtins_InterpreterEntryTrampoline [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '11: 0x102c98c30 Builtins_JSEntryTrampoline [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '12: 0x102c98918 Builtins_JSEntry [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '13: 0x1016344f4 v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '14: 0x1016335a8 v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::DirectHandle<v8::internal::Object>, v8::internal::DirectHandle<v8::internal::Object>, v8::base::Vector<v8::internal::DirectHandle<v8::internal::Object> const>) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '15: 0x101362648 v8::Function::Call(v8::Isolate*, v8::Local<v8::Context>, v8::Local<v8::Value>, int, v8::Local<v8::Value>*) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '16: 0x100e77840 node::builtins::BuiltinLoader::CompileAndCall(v8::Local<v8::Context>, char const*, node::Realm*) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '17: 0x10102fa1c node::Realm::ExecuteBootstrapper(char const*) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '18: 0x1010340dc node::PrincipalRealm::BootstrapRealm() [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '19: 0x10102fb24 node::Realm::RunBootstrapping() [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '20: 0x100cb82cc node::CreateEnvironment(node::IsolateData*, v8::Local<v8::Context>, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>> const&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>> const&, node::EnvironmentFlags::Flags, node::ThreadId, std::__1::unique_ptr<node::InspectorParentHandle, std::__1::default_delete<node::InspectorParentHandle>>, std::__1::basic_string_view<char, std::__1::char_traits<char>>) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '21: 0x1011066a8 node::worker::Worker::Run() [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '22: 0x10110ca48 node::worker::Worker::StartThread(v8::FunctionCallbackInfo<v8::Value> const&)::$_0::operator()(void*) const [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '23: 0x10110c9e4 node::worker::Worker::StartThread(v8::FunctionCallbackInfo<v8::Value> const&)::$_0::__invoke(void*) [/Users/mzasso/git/nodejs/v8-next-update/out/Debug/node]\n' +
    '24: 0x18a941c58 _pthread_start [/usr/lib/system/libsystem_pthread.dylib]\n' +
    '25: 0x18a93cc1c thread_start [/usr/lib/system/libsystem_pthread.dylib]',
  expected: '',
  operator: 'strictEqual',
  diff: 'simple'
}

Node.js v27.0.0-pre

@targos

targos commented Jul 27, 2026

Copy link
Copy Markdown
Member Author

@nodejs/v8-update @joyeecheung

@avivkeller

Copy link
Copy Markdown
Member

Can we try to include #64631?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

build Issues and PRs related to build files or the CI. dependencies Pull requests that update a dependency file. help wanted Issues that need assistance from volunteers or PRs that need help to proceed. needs-ci PRs that need a full CI run. semver-major PRs that contain breaking changes and should be released in the next major version. v8 engine Issues and PRs related to the V8 dependency.

Projects

None yet

Development

Successfully merging this pull request may close these issues.